/*CODIGO JFLEX*/
/*AREA DE IMPORTACION*/
import java.io.*;
import java_cup.runtime.*;

/*CLASE DATOS*/
class Datos{
	public static String nombreArchivo = ""; //contendra el nombre del codigo que se esta revizando	
	public static String palabra = ""; //el token que se esta revizando
	public static String codigoCorrecto = ""; //el codigo para la impresion
	public static int fila = 1; //fila actual
	public static int columna = 1; //columna actual
	public static boolean termino = false;
		
	//metodo que escribe la salida en un archivo e texto: "entrada.txt"
	public static void escribe(String archivo, String textos){
      
         try{          
            FileWriter file1 = new FileWriter(archivo+".txt");
         
            BufferedWriter buff = new BufferedWriter(file1);
         
            buff.write(textos);
            buff.newLine();
         
            buff.close();
            file1.close();
		System.out.println("Se imprimio el codigo en: "+archivo+".txt");
            }
            catch(IOException e){
               System.out.println("Error: no se puede escribir la salida");
            }
      }
}

%%

%line
%column
%cup

%{
	Datos datos = new Datos();
	boolean modoComentario = false;
%}

%eof{
	datos.termino = true;
	datos.codigoCorrecto += "";	
%eof}

/*expresiones regulares*/

letraA		=	a
letraB		=	b
letraC		=	c
epsilon		=	e
parentesisIzq	=	"("
parentesisDer	=	")"
mas		=	"+"
asterisco	=	"*"
punto		=	"."
espacio		=	[ \t\f\s\e]+
finalLinea	=	[\n\r]+
comienzoComentario = "/*"
finComentario = "*/"
texto 	= .

/*AREA DE REGLAS*/
%%

<YYINITIAL>
	{

{letraA} 		{
			  datos.palabra = yytext();
			  datos.fila = yyline;
			  datos.columna = yycolumn;
			  if(!modoComentario) datos.codigoCorrecto += yytext();	
			  return new Symbol(sym.letraA, new String(yytext()));
	  		}
{letraB} 		{
			  datos.palabra = yytext();
			  datos.fila = yyline;
			  datos.columna = yycolumn;
		      if(!modoComentario) datos.codigoCorrecto += yytext();	
			  return new Symbol(sym.letraB, new String(yytext()));
	  		}
{letraC} 		{
			  datos.palabra = yytext();
			  datos.fila = yyline;
			  datos.columna = yycolumn;
		      if(!modoComentario) datos.codigoCorrecto += yytext();	
			  return new Symbol(sym.letraC, new String(yytext()));
	  		}
{epsilon} 		{
			  datos.palabra = yytext();
			  datos.fila = yyline;
			  datos.columna = yycolumn;
		      if(!modoComentario) datos.codigoCorrecto += yytext();	
			  return new Symbol(sym.epsilon, new String(yytext()));
	  		}
{parentesisDer} 		{
			  datos.palabra = yytext();
			  datos.fila = yyline;
			  datos.columna = yycolumn;
		      if(!modoComentario) datos.codigoCorrecto += yytext();	
			  return new Symbol(sym.parentesisDer, new String(yytext()));
	  		}
{parentesisIzq} 		{
			  datos.palabra = yytext();
			  datos.fila = yyline;
			  datos.columna = yycolumn;
		      if(!modoComentario) datos.codigoCorrecto += yytext();	
			  return new Symbol(sym.parentesisIzq, new String(yytext()));
	  		}
{mas} 			{
			  datos.palabra = yytext();
			  datos.fila = yyline;
			  datos.columna = yycolumn;
		      if(!modoComentario) datos.codigoCorrecto += yytext();	
			  return new Symbol(sym.mas, new String(yytext()));
	  		}
{asterisco} 		{
			  datos.palabra = yytext();
			  datos.fila = yyline;
			  datos.columna = yycolumn;
		      if(!modoComentario) datos.codigoCorrecto += yytext();	
			  return new Symbol(sym.asterisco, new String(yytext()));
	  		}
{punto} 		{
			  datos.palabra = yytext();
			  datos.fila = yyline;
			  datos.columna = yycolumn;
		      if(!modoComentario) datos.codigoCorrecto += yytext();	
			  return new Symbol(sym.punto, new String(yytext()));
	  		}
{espacio} 		{
			  datos.palabra = yytext();
			  datos.fila = yyline;
			  datos.columna = yycolumn;
		      if(!modoComentario) datos.codigoCorrecto += " ";	
			  return new Symbol(sym.espacio, new String(yytext()));
	  		}
{finalLinea} 		{
			  datos.palabra = yytext();
			  datos.fila = yyline;
			  datos.columna = yycolumn;
		      if(!modoComentario) datos.codigoCorrecto += "\n";
			  return new Symbol(sym.espacio, new String(""));
	  		}
{comienzoComentario} 		{
			  datos.palabra = yytext();
			  datos.fila = yyline;
			  datos.columna = yycolumn;
		      datos.codigoCorrecto += "";
			  modoComentario = true;
			  return new Symbol(sym.comienzoComentario, new String(yytext()));
	  		}
{finComentario} 		{
			  datos.palabra = yytext();
			  datos.fila = yyline;
			  datos.columna = yycolumn;
		      datos.codigoCorrecto += "";	
			  modoComentario=false;
			  return new Symbol(sym.finComentario, new String(yytext()));
	  		}
{texto} 		{
			  datos.palabra = yytext();
			  datos.fila = yyline;
			  datos.columna = yycolumn;
		      datos.codigoCorrecto += "";	
			  if(!modoComentario)
			  {
				  System.out.println(
				  "<"+datos.nombreArchivo+">: Error Lexico ("+yyline+","+yycolumn+"): lexema \"<"+yytext()+">\" no valido"
				  );
			  }
			  return new Symbol(sym.texto, new String(yytext()));
	  		}
	}
